package com.nts.visionworks.core.security.controller;

import java.security.InvalidParameterException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.nts.visionworks.core.hibernate.query.PaginationDirector;
import com.nts.visionworks.core.security.domain.FunctionDefinitions;
import com.nts.visionworks.core.security.domain.ManagementDepartment;
import com.nts.visionworks.core.security.domain.ManagementMember;
import com.nts.visionworks.core.security.domain.SecurityAccessTrace;
import com.nts.visionworks.core.security.domain.SecurityAuthority;
import com.nts.visionworks.core.security.domain.SecurityAuthorityFunction;
import com.nts.visionworks.core.security.domain.SecurityGroup;
import com.nts.visionworks.core.security.domain.SecurityIdentity;
import com.nts.visionworks.core.security.service.SecurityService;

/**
 * 보안 관련 요청을 처리하기 위한 인터페이스를 제공한다.
 * @author Devcken
 */
@Controller
@RequestMapping("/security")
public class SecurityController
{
	private final static Logger logger = LoggerFactory.getLogger(SecurityController.class);
	
	/**
	 * 보안 계정 목록에 대한 페이지 설정 키를 나타낸다.
	 */
	private final static String _SECURITY_IDENTITIES_PAGINATION_KEY = "SECURITY_IDENTITIES";
	
	/**
	 * 보안 계정 목록의 페이지 당 기본 게시물 개수를 나타낸다.
	 */
	private final static int _SECURITY_IDENTITIES_PAGINATION_DEFAULT_SIZE = 20;
	
	/**
	 * 보안 관련 DAO를 주입받는다.
	 */
	@Resource(name="securityService")
	private SecurityService _securityService;
	
	/**
	 * 데이터 페이지네이션을 위한 지시자를 주입받는다.
	 */
	@Resource(name="paginationDirector")
	private PaginationDirector _paginationDirector;
	
	@RequestMapping(value="/identities", method=RequestMethod.GET)
	public ModelAndView listIdentities(HttpServletRequest request)
	{
		return new ModelAndView("security.identity.list");
	}
	
	/**
	 * 보안 계정 목록 조회 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param page 보안 계정 목록에 대해 조회하고자 하는 페이지 번호가 전달된다.
	 * @param enabled 보안 계정의 사용 여부를 나타내는 검색 조건이 전달된다.
	 * @param locked 보안 계정의 잠금 여부를 나타내는 검색 조건이 전달된다.
	 * @param expired 보안 계정의 만료 여부를 나타내는 검색 조건이 전달된다.
	 * @return 보안 계정 목록을 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/identity/list", method=RequestMethod.GET)
	public ModelAndView listIdentities(HttpServletRequest request,
			@RequestParam(value="page", required=false)Integer page,
			@RequestParam(value="enabled", required=false, defaultValue="true")boolean enabled,
			@RequestParam(value="locked", required=false, defaultValue="false")boolean locked,
			@RequestParam(value="expired", required=false, defaultValue="false")boolean expired)
	{
		Map<String, Object> result = new HashMap<String, Object>();
		
		try
		{
			Integer pageSize = this._paginationDirector.getPageSize(request, _SECURITY_IDENTITIES_PAGINATION_KEY);
			
			// 특정 페이지에 대한 요청이 없는 경우, 페이지 지시자로부터 페이지 번호를 가져온다.
			if (page == null)
			{
				page = this._paginationDirector.getPage(request, _SECURITY_IDENTITIES_PAGINATION_KEY);
			}
			// 특정 페이지에 대해 요청이 된 경우, 페이지 지시자에 요청된 페이지 번호를 설정한다.
			else
			{
				this._paginationDirector.setPage(request, _SECURITY_IDENTITIES_PAGINATION_KEY, page);
			}
			
			result.put("identities", this._securityService.listSecurityIdentities(enabled, locked, expired));
			result.put("pageSize", pageSize);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", result);
	}
	
	/**
	 * 보안 계정 추가 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param authorityKey 보안 계정의 권한 키가 전달된다.
	 * @param securityId 보안 아이디가 전달된다.
	 * @param securityPassword 보안 암호가 전달된다.
	 * @param groupId 보안 계정이 소속될 보안 그룹 아이디가 전달된다.
	 * @param membersId 보안 계정에 속하는 관리자 아이디 목록을 설정한다.
	 * @return 추가된 보안 계정 정보를 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/identity/insert", method=RequestMethod.GET)
	public ModelAndView insertIdentity(HttpServletRequest request,
			@RequestParam(value="authorityKey", required=true)String authorityKey,
			@RequestParam(value="securityId", required=true)String securityId,
			@RequestParam(value="securityPassword", required=true)String securityPassword,
			@RequestParam(value="groupId", required=true)Integer groupId,
			@RequestParam(value="membersId", required=false)Integer[] membersId)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			// 보안 계정은 한 개 이상의 보안 그룹에 속해야 한다.
			if (groupId < 1)
			{
				throw new InvalidParameterException("The security identity must belong to at least one or more groups.");
			}
			
			// 보안 계정에는 한 명 이상의 관리자가 소속되어야 한다.
			if (membersId.length == 0)
			{
				throw new InvalidParameterException("More than one member must use the security identity.");
			}
			
			SecurityIdentity identity = this._securityService.insertSecurityIdentity(securityId, securityPassword, groupId, authorityKey, membersId);
			
			map.put("identity", identity);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 보안 계정 수정 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param identityId 수정하려는 보안 계정 아이디가 전달된다.
	 * @param membersId 보안 계정에 속하는 관리자 아이디 목록을 설정한다.
	 * @return 수정된 보안 계정 정보를 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/identity/update", method=RequestMethod.GET)
	public ModelAndView updateIdentity(HttpServletRequest request,
			@RequestParam(value="identityId", required=true)Long identityId,
			@RequestParam(value="membersId", required=false)Integer[] membersId)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			// 보안 계정 수정을 위해서는 대상의 보안 계정 아이디가 필요하다.
			if (identityId < 1)
			{
				
			}
			
			// 보안 계정에는 한 명 이상의 관리자가 소속되어야 한다.
			if (membersId.length == 0)
			{
				throw new InvalidParameterException("More than one member must use the security identity.");
			}
			
			this._securityService.updateSecurityIdentity(identityId, membersId);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 보안 계정 삭제 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param identityId 삭제하려는 보안 계정 아이디가 전달된다.
	 * @return 보안 계정 정보를 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/identity/delete", method=RequestMethod.GET)
	public ModelAndView deleteIdentity(HttpServletRequest request,
			@RequestParam(value="identityId", required=true)Long identityId)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			SecurityIdentity identity = new SecurityIdentity();
			
			identity.setIdentityId(identityId);
			
			this._securityService.deleteSecurityIdentity(identity);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 보안 계정 잠금 요청에 대한 처리 결과를 뷰로 전달한다. 
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param identityId 잠그려고 하는 보안 계정 아이디가 전달된다.
	 * @return 보안 계정 정보를 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/identity/lock", method=RequestMethod.GET)
	public ModelAndView lockIdentity(HttpServletRequest request,
			@RequestParam(value="identityId", required=true)Long identityId)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		
		{
			SecurityIdentity identity = new SecurityIdentity();
			
			identity.setIdentityId(identityId);
			
			this._securityService.lockSecurityIdentity(identity);
			
			map.put("identity", identity);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 보안 계정 만료 요청에 대한 처리 결과를 뷰로 전달한다. 
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param identityId 만료 시킬 보안 계정 아이디가 전달된다.
	 * @return 보안 계정 정보를 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/identity/expire", method=RequestMethod.GET)
	public ModelAndView expireSecurityIdentity(HttpServletRequest request,
			@RequestParam(value="identityId", required=true)Long identityId)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			SecurityIdentity identity = new SecurityIdentity();
			
			identity.setIdentityId(identityId);
			
			this._securityService.expireSecurityIdentity(identity);
			
			map.put("identity", identity);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 보안 그룹 목록 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @return 보안 그룹 목록을 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/group/list", method=RequestMethod.GET)
	public ModelAndView listSecurityGroups(HttpServletRequest request)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			List<SecurityGroup> groups = this._securityService.listSecurityGroups();
			
			map.put("groups", groups);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 보안 그룹 저장 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param securityGroup 저장하고자 하는 보안 그룹 정보가 전달된다.
	 * @return 저장된 보안 그룹을 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/group/save", method=RequestMethod.GET)
	public ModelAndView saveSecurityGroup(HttpServletRequest request,
			SecurityGroup securityGroup)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			this._securityService.saveSecurityGroup(securityGroup);
			
			map.put("group", securityGroup);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 보안 그룹 삭제 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param groupId 삭제하고자 하는 보안 그룹 아이디가 전달된다.
	 * @return 삭제 결과를 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/group/delete", method=RequestMethod.GET)
	public ModelAndView deleteSecurityGroup(HttpServletRequest request,
			@RequestParam(value="groupId", required=true)Integer groupId)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			this._securityService.deleteSecurityGroup(groupId);
			
			map.put("group", groupId);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 보안 권한 목록 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @return 보안 권한 목록을 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/authority/list", method=RequestMethod.GET)
	public ModelAndView listSecurityAuthority(HttpServletRequest request)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			List<SecurityAuthority> authorities = this._securityService.listSecurityAuthorities();
			
			map.put("authorities", authorities);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 보안 권한의 권한 기능 목록 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param authorityKey 권한 기능에 대한 보안 권한 키가 전달된다.
	 * @return 보안 권한 기능을 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/authority/function/list", method=RequestMethod.GET)
	public ModelAndView listSecurityAuthorityFunctions(HttpServletRequest request,
			@RequestParam(value="authorityKey", required=true)String authorityKey)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			List<SecurityAuthorityFunction> functions = this._securityService.listSecurityAuthorityFunctions(authorityKey);
			
			map.put("authorityFunctions", functions);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 보안 권한 기능 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param functionKey 권한 기능에 대한 기능 정의 키가 전달된다.
	 * @param authorityKey 권한 기능에 대한 보안 권한 키가 전달된다.
	 * @return 보안 권한 기능 정보를 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/authority/function/view", method=RequestMethod.GET)
	public ModelAndView viewSecurityAuthorityFunction(HttpServletRequest request,
			@RequestParam(value="functionKey", required=true)String functionKey,
			@RequestParam(value="authorityKey", required=true)String authorityKey)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			SecurityAuthorityFunction function = this._securityService.viewSecurityAuthorityFunction(functionKey, authorityKey);
			
			map.put("authorityFunction", function);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 보안 권한 기능 추가 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param functionKey 권한 기능에 대한 기능 정의 키가 전달된다.
	 * @param authorityKey 권한 기능에 대한 보안 권한 키가 전달된다.
	 * @param create 생성 권한 소유 여부가 전달된다.
	 * @param read 조회/열람 권한 소유 여부가 전달된다.
	 * @param update 수정 권한 소유 여부가 전달된다.
	 * @param delete 삭제 권한 소유 여부가 전달된다.
	 * @return 보안 권한 기능 정보를 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/authority/function/insert", method=RequestMethod.GET)
	public ModelAndView insertSecurityAuthorityFunction(HttpServletRequest request,
			@RequestParam(value="functionId", required=true)Integer functionId,
			@RequestParam(value="authorityId", required=true)Integer authorityId,
			@RequestParam(value="create", required=true)boolean create,
			@RequestParam(value="read", required=true)boolean read,
			@RequestParam(value="update", required=true)boolean update,
			@RequestParam(value="delete", required=true)boolean delete)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			SecurityAuthorityFunction authorityFunction = this._securityService.insertSecurityAuthorityFunction(functionId, authorityId, create, read, update, delete);
			
			map.put("authorityFunction", authorityFunction);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 기능 정의 목록 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @return 기능 정의 목록을 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/function/list", method=RequestMethod.GET)
	public ModelAndView listFunctionDefinitions(HttpServletRequest request)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			List<FunctionDefinitions> functionDefinitions = this._securityService.listFunctionDefinitions();
			
			map.put("functionDefinitions", functionDefinitions);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 보안 접근 기록 목록 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param searchStartDateTime 접근 날짜/시각에 대한 검색 시작 조건을 설정한다.
	 * @param searchEndDateTime 접근 날짜/시각에 대한 검색 종료 조건을 설정한다.
	 * @return 보안 접근 기록 목록을 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/access/list", method=RequestMethod.GET)
	public ModelAndView listSecurityAccessTraces(HttpServletRequest request,
			@RequestParam(value="searchStartDateTime", required=true)Date searchStartDateTime,
			@RequestParam(value="searchEndDateTime", required=true)Date searchEndDateTime)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			List<SecurityAccessTrace> accessTraces = this._securityService.listSecurityAccessTraces(searchStartDateTime, searchEndDateTime);
			
			map.put("accessTraces", accessTraces);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 보안 접근 기록 추가 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param accessType 접근 유형이 전달된다.
	 * @param remoteIpAddress 접근 계정 IP 주소가 전달된다.
	 * @param localIpAddress 접근 서버 IP 주소가 전달된다.
	 * @return 보안 접근 기록 정보를 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/access/insert", method=RequestMethod.GET)
	public ModelAndView insertAccessTrace(HttpServletRequest request,
			@RequestParam(value="accessType", required=true)Short accessType,
			@RequestParam(value="remoteIpAddress", required=false)String remoteIpAddress,
			@RequestParam(value="localIpAddress", required=true)String localIpAddress)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			Long identityId = 0L;
			
			SecurityAccessTrace accessTrace = this._securityService.insertSecurityAccessTrace(identityId, accessType, remoteIpAddress, localIpAddress);
			
			map.put("accessTrace", accessTrace);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 관리 부서 목록 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @return 관리 부서 목록을 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/department/list", method=RequestMethod.GET)
	public ModelAndView listManagementDepartments(HttpServletRequest request)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{			
			List<ManagementDepartment> departments = this._securityService.listManagementDepartments();
			
			map.put("departments", departments);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 관리 부서 저장 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param department 저장할 관리 부서 정보가 전달된다.
	 * @return 저장된 관리 부서 정보를 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/department/save", method=RequestMethod.GET)
	public ModelAndView saveManagementDepartment(HttpServletRequest request,
			ManagementDepartment department)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			this._securityService.saveManagementDepartment(department);
			
			map.put("department", department);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 관리 부서 삭제 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param department 삭제하려는 관리 부서 정보가 전달된다.
	 * @return 삭제된 관리 부서 정보를 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/department/delete", method=RequestMethod.GET)
	public ModelAndView deleteManagementDepartment(HttpServletRequest request,
			ManagementDepartment department)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			this._securityService.deleteManagementDepartment(department.getDepartmentId());
			
			map.put("department", department);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}

	/**
	 * 관리자 목록 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param departmentId 요청하려는 관리자 목록에 대한 소속 관리 부서 아이디가 전달된다. 
	 * @return 관리자 목록을 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/member/list", method=RequestMethod.GET)
	public ModelAndView listManagementMembers(HttpServletRequest request,
			@RequestParam(value="departmentId", required=true)Long departmentId)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{			
			List<ManagementMember> members = this._securityService.listManagementMembers(departmentId);
			
			map.put("members", members);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 관리자 정보 저장 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param userName 관리자 이름이 전달된다.
	 * @param email 이메일 주소가 전달된다.
	 * @param level 직위가 전달된다.
	 * @param phoneNo 일반 전화 번호가 전달된다.
	 * @param cellNo 휴대 전화 번호가 전달된다.
	 * @param departmentsId 소속 관리 부서 아이디 목록이 전달된다.
	 * @return 저장된 관리자 정보를 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/member/save", method=RequestMethod.GET)
	public ModelAndView saveManagementMember(HttpServletRequest request,
			@RequestParam(value="userName", required=true)String userName,
			@RequestParam(value="email", required=true)String email,
			@RequestParam(value="level", required=true)String level,
			@RequestParam(value="phoneNo", required=true)String phoneNo,
			@RequestParam(value="cellNo", required=true)String cellNo,
			@RequestParam(value="departmentsId", required=true)List<Long> departmentsId)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{			
			ManagementMember member = this._securityService.saveManagementMember(userName, email, level, phoneNo, cellNo, departmentsId);
			
			map.put("member", member);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 관리자 정보 삭제 요청에 대한 처리 겨로가를 뷰로 전달한다. 
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param memberId 삭제하려는 관리자 아이디가 전달된다.
	 * @return 삭제된 관리자 정보를 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/member/delete", method=RequestMethod.GET)
	public ModelAndView deleteManagementMember(HttpServletRequest request,
			@RequestParam(value="memberId", required=true)Integer memberId)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{			
			this._securityService.deleteManagementMember(memberId);
			
			map.put("member", memberId);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
}